<h1>Comunicando Wiring y su programa de C++</h1>
	
<p>
<table width="656">
   	<tr>
   	<td>
   	<p>por Andres Burbano, University of California Santa Barbara.</p>
   	<p>Este tutorial muestra como leer datos seriales desde el hardware Wiring codificado en C/C++ en m&aacute;quinas basadas en UNIX (OSX y Linux), los ejemplos leen datos desde la tarjeta Wiring donde est&aacute;n conectados un sensor de ultrasonido ping o un potenci&oacute;mentro. </p>
   	<p><strong>Equipamento:</strong> </p>
    <p>Ser&aacute; necesario un ping de ultrasonido parallax (digital) o el potenci&oacute;metro (an&aacute;logo). Esto no ha sido probado en Windows. </p>
    <p>&nbsp;</p>
    <p><strong>Proceso: </strong></p>
    <p>Paso 0. Conecte la tarjeta I/O Wiring usando un cable USB a su computador, conecte el sensor de ultrasonido ping y/o la resistencia variable a la tarjeta I/O Wiring. El ultrasonido ping va al pin digital uno, y el potenci&oacute;metro va al pin an&aacute;logo uno. Paso uno: Programe la tarjeta I/O Wiring con el lenguaje Wiring , el modo m&aacute;s f&aacute;cil es usar los ejemplos que est&aacute;n publicados en la secci&oacute;n de Learning para leer datos desde el ping o el potenci&oacute;metro (son diferentes). </p>
    <p><a href="http://wiring.org.co/learning/basics/parallaxping.html">Ejemplo para leer desde un Parallax ping</a><br />
      <a href="http://wiring.org.co/learning/basics/potentiometer.html">Ejemplo Potenci&oacute;metro</a></p>
    <p>C&oacute;digo para el Sensor de Ultrasonido Ping / sensor PING Parallax</p>
    <p>Paso 2. Identifique en su computador el puerto Serial creado cuando la tarjeta I/O Wiring es conectada. Es posible solo revisando el men&uacute; Tools / Serial Port antes y despu&eacute;s de conectar la tarjeta para identificar el puerto correspondiente, seleccione de la lista el m&aacute;s apropiado. Debe ser algo como esto: tty.usbserial-0000103D </p>
    <p>Paso 3. Inicie su rutina en C/C++ incluyendo las siguiente librer&iacute;as: </p>
    <pre>#include &lt;iostream&gt; 
#include &lt;fcntl.h&gt; 
#include &lt;termios.h&gt; 


#define USB_SERIAL_PORT &quot;/dev/tty.usbserial-0000103D&quot; // (OSX Power Book) 
//#define USB_SERIAL_PORT  &quot;/dev/cu.usbserial-3B1&quot; // (OSX Mac Book) 
//#define USB_SERIAL_PORT &quot;/dev/tty.usbserial-0000103D&quot; // (Linux Ubuntu Mac Book) 
//#define USB_SERIAL_PORT &quot;/dev/tty.usbserial-0000103D&quot; 
    </pre>
    <p> Paso 4. Cree una funci&oacute;n como esta para leer los datos y analizar la informaci&oacute;n desde el puerto serial: Para el ping Ultrasonido es algo as&iacute;: <br />
    </p>
    <pre>
int port_fd; 
int init_serial_input (char * port) {   
  int fd = 0;   
  struct termios options;   

  fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);   
  if (fd == -1)     
    return fd;   
    fcntl(fd, F_SETFL, 0);    // clear all flags on descriptor, enable direct I/O   
    tcgetattr(fd, &amp;options);   // read serial port options   
    // enable receiver, set 8 bit data, ignore control lines   
    options.c_cflag |= (CLOCAL | CREAD | CS8);    
    // disable parity generation and 2 stop bits   
    options.c_cflag &amp;= ~(PARENB | CSTOPB);  
    // set the new port options   
    tcsetattr(fd, TCSANOW, &amp;options);      
    return fd; 
}
    </pre>
    <p> Paso 5. Tranforma la informaci&oacute;n que recibe desde ASCII a otro tipo, en este caso a entero <br />
    </p>
    <pre>
int read_serial_int (int fd) {     
  char ascii_int[8] = {0};     
  char c = NULL;     
  int i = 0;     

  read(fd, &amp;c, 1);         
  //while (c != '\n')     
  while (c != ' ')  {         
    ascii_int[i++] = c;         
    read(fd, &amp;c, 1);     
  }     
  return atoi(ascii_int); 
} 
    </pre>
    <p>NOTA: Hay una peque&ntilde;a diferencia entre el Potenci&oacute;metro y el Ping de Ultrasonido en la l&iacute;nea: while (c != ' ') Para el ping de ultrasonido es: while (c != '\n') Para el potenci&oacute;metro es: while (c != ' ')</p>
    <p>Paso 6. Luego puede hacer operaciones para obtener los valores espec&iacute;ficos que necesita, este es solo un ejemplo: </p>
    <pre>void sound() {              
  data.val = read_serial_int(port_fd);                                     
  if (data.val &gt;= 0 &amp;&amp; data.val &lt;= 8000)  {                          
    if (data.val &gt; 2000)                              
      data.val2 = -((8000 - data.val) / 10000.0f);                          
    else                          
      data.val2 = (data.val) / 1000.0f;                                         
    data.val3 = (data.val) / 10000.0f;                          
    cout &lt;&lt; data.val3 &lt;&lt; endl;                      
  }                      
}                            
    </pre>
    <p>Paso 7. Finalmente dentro de la funci&oacute;n main debe haber el siguiente c&oacute;digo que realmente inicializa la entrada serial</p>
    <pre>port_fd = init_serial_input(USB_SERIAL_PORT);                 
// serial is checked              
if (port_fd == -1)  {                  
  cout &lt;&lt; &quot;Couldn't open USB port&quot; &lt;&lt; endl;              
}                       
    </pre>
    <p> Disfrute, y contribuya!!! vea los ejemplos aqu&iacute;: </p>
    <p><a href="http://burbane.org/mat_233/">Paradiso</a> un modelado b&aacute;sico 3D en OpenGL de estructura &quot;Paradiso&quot; como es descrito en la &quot;Divina Commedia&quot; por Dante Alighieri (El orden de las esferas de &quot;Paradiso&quot; es: Luna, Mercurio, Venus, Sol, Marte, Jupiter, Saturno, Estrellas, Primum Mobile y Empyrean). Paradiso es tambi&eacute;n un intento de explorar la posibilidad de transladar la experiencia de vuelo usando un escenario virtual y una entrada externa, porque funciona con un sensor de ultrasonido ping que mide la diferencia de movimiento de la distancia de la mano del usuario respecto al sensor. El sensor no es invasivo por lo tanto el usuario puede interactuar con su movimiento. Paradiso es un sketch para una instalaci&oacute;n interactiva. </p>
    <p><a href="http://burbane.org/mat_201b/">Square_Rot</a> es un sketch de un herrramienta de perfomance interactivo en tiempo real (audio y video). El objetivo del proyecto es usando la integraci&oacute;n de entradas seriales en C++ y un micr&oacute;fono como entrada tranformando elementos en Opengl, generando s&iacute;ntesis b&aacute;sicas de audio usando PortAudio. Realmente es ruido. </p>
    <p>Gracias especiales a: amar, newman, shear y villegas</p>
    </td>
  </tr>
  </table>
</p>
